package com.hook.hookonclick

import android.util.Log
import android.view.View

object HookOnClick {
    fun hookOnClickListener(view: View) {
        try {
            //获取view的ListenerInfo方法
            val getListenerInfo = View::class.java.getDeclaredMethod("getListenerInfo")
            //开发访问权限
            getListenerInfo.isAccessible = true

            val listenerInfo = getListenerInfo.invoke(view)

            //得到原始的OnClickListener对象
            val listenerInfoClz = Class.forName("android.view.View\$ListenerInfo")
            val mOnClickListener = listenerInfoClz.getDeclaredField("mOnClickListener")

            mOnClickListener.isAccessible = true

            val originOnClickListener: View.OnClickListener =
                mOnClickListener.get(listenerInfo) as View.OnClickListener

            //用自定义的onClickListener替换原始的onClickListener
            val hookedOnClickListener = OnClickProxy(originOnClickListener)

            mOnClickListener.set(listenerInfo, hookedOnClickListener)
        } catch (e: Exception) {
            e.printStackTrace()
            Log.d("hook点击事件", e.message.toString())
        }
    }
}

/**
 * 设置点击事件的代理
 */
class OnClickProxy(private val originalListener: View.OnClickListener) : View.OnClickListener {

    override fun onClick(v: View?) {
        originalListener.onClick(v)
        Log.d("hook点击事件", "实现埋点操作")
    }
}